package com.sam.designpatterns

// 命令模式
// 接收者类
class Receiver {
    // 真正执行具体命令逻辑的方法
    fun action() {
        print("执行具体操作")
    }
}
// 抽象命令接口
interface Command {
    // 命令接口的执行方法
    fun execute()
}

/**
 * 具体的命令类
 * receiver: 持有一个接收者对象的引用
 */
class ConcreteCommand(
        private val receiver: Receiver
) : Command {
    override fun execute() {
        receiver.action()
    }
}

// 请求者类
class Invoker(private val command: Command) {
    fun action() {
        // 调用具体命令对象，执行具体命令
        command.execute()
    }
}

class Client {
    fun main() {
        // 构造一个接收者对象
        val receiver = Receiver()
        // 根据接收者对象构造一个命令对象
        val command = ConcreteCommand(receiver)
        // 根据具体的命令构造请求者对象
        val invoker = Invoker(command)
        // 执行请求方法
        invoker.action()
    }
}

